Date : 17/5/94 + 24-25/06/94
Protection : MOT DE PASSE
Programme : GENESIA
Outils : SOFT-ICE V2.50 + V2.64 avec EMS
Fichier : GENESIA.EXE
Temps pass� : 25mn + 1h
Soci�t� : Micro�ds
Origine : C.D.
Divers : pr�trait� par STACK RIPPER
Num�ro : 247
En hommage � STACK RIPPER je laisse ici son essai de crackage. Ce
dernier fonctionne lors de la demande du mot de passe initial mais
ne fonctionne plus lors de la seconde demande apr�s avoir restaur�
un fichier sauvegard�.
� Pas vraiment difficile. Il m'a suffit de tracer le programme (et
� sp�cialement la routine de code), de la remonter pour arriver au
� CALL responsable de l'affichage de la demande du code , et d'interver-
� tir le saut d'apr�s. Bon mon p�re souhaite que je m'�tale un peu plus
� donc je vais d�tailler ce crack. Apr�s l'appel de Soft-Ice, on se
� trouve dans un longue boucle se terminant par un test de la touche
� ENTREE (0D). On la quitte par un RETF et quelques instructions plus
� tard, on parvient � un test de AX, puis forc�ment � un saut qui, si
� le joueur � mal r�pondu au bout de 3 essais renvoie ce dernier au
� DOS. C'est ce saut qu'il faut inverser (ou plut�t forcer). Voici
� donc pour la version 640*480 :
�
� 15F9:010C 7503 JNZ 0111 --> devient JMP 0111
�
� Et pour la version 320*200 (c'est la m�me routine, mot pour mot, mais
� le fichier EXE est plus court, donc le saut de trouve avant) :
�
� 15F9:00E5 7503 JNZ 00EA --> devient JMP 00EA
�
� STACK RIPPER
Lorsque l'inversion d'un saut ne donne pas l'effet escompter il faut
trouver ce qui agit sur le saut. En l'occurence le contenu de AX et
comment celui-ci est d�termin�.
Apr�s diff�rents essais il semble que ce n'est pas suffisant. J'ai donc
d�cid� de remonter � la source du probl�me.
Apr�s avoir activer la touche ENTER test�e en CS:16F4
CS=4BB2
CS:16F4 807EFC0D CMP BYTE PTR [BP-04],0D
CS:16F8 7403 JZ 16FD
on trouve un CALL qui doit probablement test� le code entr� avec
celui se trouvant en m�moire. Mais en tra�ant ce CALL on ne trouve
rien.
Il ne reste plus que de faire un point d'arr�t au moment o� le
programme lit le code entr� pour le comparer avec celui se trouvant
dans le programme.
Mais on ne sait pas o� se trouve le code que l'on vient de taper.
Il existe deux m�thodes pour le trouver.
-1) Mettre un point d'arr�t sur le port du clavier et regarder o� le
programme va mettre l'octet tap�. C'est fastidieux surtout qu'�
ce niveau le caract�re est un SCAN-CODE et n'est pas en ASCII.
-2) Faire une recherche de la chaine tap�e avec tous les segments
( donn�es, ES, SS et m�me CS d�s fois qu'un programmeur vicieux
aurait plac� les donn�es dans le code ). Pour cel� il faut taper
une chaine facilement identifiable telle que FREDDY par-exemple.
Avec S DS:0 L FFFF 'FREDDY' pour les 64k du segment de donn�es.
Avec S ES:0 L FFFF 'FREDDY' pour les 64k de l'extra-segment.
Avec S SS:0 L FFFF 'FREDDY' pour les 64k du segment du stack.
etc...
Et en g�n�ral on trouve.
Dans le cas pr�sent la chaine est en: ES:1FE0. Il ne suffit plus que de
mettre un point d'arr�t sur la position ES:1FE0 en lecture pour trouver
les instructions de comparaisons et o� se trouve la chaine � comparer.
BPMB ES:1FE0 R
D�s lors on trouve les instructions de comparaisons suivantes qui se
trouve dans la m�me routine qui checke la demande de code au d�but du
jeu que celle qui demande en cliquant sur la caserne blanche dans une
sauvegarde:
CS=306E
CS:0012 B9FFFF MOV CX,FFFF
CS:0015 F2AE REPNZ SCASB ; Cherche tant que # de AX sinon quitte.
CS:0017 F7D1 NOT CX ; Cx contient la taille du mot.
CS:0019 2BF9 SUB DI,CX ; On se repositionne au d�but pour...
CS:001B F3A6 REPZ CMPSB ; ...comparer la chaine et on quitte
si pas �gal ou si CX=0.
Nota: Ces instructions sont compl�tement d�taill�es par SOURCER � la
fin de ce DEP.
La chaine tap�e se trouve comme suit dans ES:DI FREDDY..............
La chaine du SOFT se trouve comme suit en DS:SI MORAL.MONDE.LAC.DEST
Une petite explication: Les mots ne sont pas s�par�s par des points
mais par le caract�re NUL=00. PCTOOLS affiche un point lorsque le
caract�re n'est pas affichable, caract�re de control, retour ligne,
line feed, etc. Donc l'instruction REPNZ ( r�p�te tant que CX#0 )
SCASB ( recherche dans une chaine le caract�re qui se trouve dans
AX ) Ici on a NUL dans AX soit 0000. Donc CX qui �tait � FFFF se trouve
par exemple � FFFA si le mot �tait "MORAL.". En faisant un NOT CX on
inverse son contenu et on trouve F-A=5 lettres. Donc CX contenant 5 on
va comparer maintenant ces 5 caract�res avec REPZ CMPSB ( compare
string byte ). Au fait ce programme semble avoir �t� �crit en C.
Alors ici il y a plein de solutions, mais la plus simple est d'aller
voir avec PCTOOLS si les chaines � comparer ne sont pas en clair dans
le SOFT ! Si si �a arrive.
Et je te le donne en mille. Elles sont en CLAIR dans le fichier
GENESIA.EXE !
Il ne reste plus que de remplacer les 50 mots de passe structur�s comme
suit:
MORAL.MONDE.LAC.DESTINATION.CONSTRUIRE.etc.etc.etc.
Par des zeros comme suit ( des zeros en ASCII �videmment ):
0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.
Ce qui donne en HEXA:
30 00 30 00 30 00 30 00 30 00 30 00 30 00 30 00 etc...
Et rajouter lors de la demande de mot de passe ( puisqu'elle est en
clair ) un message expliquant qu'il suffit de taper 0 et ENTER !
Les copies d'�cran ci-apr�s ont �t� faites avec CET.COM:
Ci-dessous le secteur original du texte accompagnant la demande du mot
de passe. Et plus loin le m�me texte modifi�.
GENESIA.EXE Secteur Relatif 0000368 Groupe 38383 Sect rel disk 0614535
0032 56 34 3E 27 4D 41 4C 47 52 45 20 56 4F 53 20 51 V4>'MALGRE VOS Q
0048 55 41 4C 49 54 45 53 20 43 45 52 54 41 49 4E 45 UALITES CERTAINE
0064 53 20 45 54 20 4C 41 20 43 4F 4E 46 49 41 4E 43 S ET LA CONFIANC
0080 45 00 51 55 45 20 56 4F 55 53 20 41 43 43 4F 52 E QUE VOUS ACCOR
0096 44 45 20 4C 41 20 50 4F 50 55 4C 41 54 49 4F 4E DE LA POPULATION
0112 20 44 45 20 47 45 4E 45 53 49 41 2C 00 43 45 52 DE GENESIA, CER
0128 54 41 49 4E 53 20 44 4F 55 54 45 4E 54 20 51 55 TAINS DOUTENT QU
0144 45 20 56 4F 55 53 20 53 4F 59 45 5A 20 4C 27 48 E VOUS SOYEZ L'H
0160 45 52 49 54 49 45 52 00 44 45 20 4C 27 41 4E 43 ERITIER DE L'ANC
0176 49 45 4E 20 50 52 49 4E 43 45 2E 20 50 4F 55 52 IEN PRINCE. POUR
0192 20 4C 45 53 20 52 41 53 53 55 52 45 52 2C 00 49 LES RASSURER, I
0208 44 45 4E 54 49 46 49 45 5A 20 56 4F 54 52 45 20 DENTIFIEZ VOTRE
0224 56 45 52 53 49 4F 4E 20 43 4F 4D 4D 45 20 45 54 VERSION COMME ET
0240 41 4E 54 20 00 55 4E 20 4F 52 49 47 49 4E 41 4C ANT UN ORIGINAL
0256 2E 00 44 4F 4E 4E 45 5A 20 4C 45 20 50 52 45 4D . DONNEZ LE PREM
0272 49 45 52 20 4D 4F 54 00 50 41 47 45 3A 20 20 20 IER MOT PAGE:
0048 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0064 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0080 20 00 20 20 20 20 20 20 20 46 52 45 44 44 59 5F FREDDY_
0096 53 4F 54 20 45 54 20 53 54 41 43 4B 20 52 49 50 SOT ET STACK RIP
0112 50 45 52 20 20 20 20 20 20 20 20 20 00 20 53 4F PER SO
0128 4E 54 20 46 49 45 52 53 20 44 45 20 56 4F 55 53 NT FIERS DE VOUS
0144 20 50 52 45 53 45 4E 54 45 52 20 43 45 20 4C 4F PRESENTER CE LO
0160 47 49 43 49 45 4C 20 00 20 20 20 20 20 20 20 53 GICIEL S
0176 41 4E 53 20 41 55 43 55 4E 45 20 50 52 4F 54 45 ANS AUCUNE PROTE
0192 43 54 49 4F 4E 2E 20 20 20 20 20 20 20 20 00 20 CTION.
0208 20 20 20 20 4A 55 53 54 45 20 54 41 50 45 5A 20 JUSTE TAPEZ
0224 5A 45 52 4F 20 45 54 20 45 4E 54 45 52 2E 20 20 ZERO ET ENTER.
0240 20 20 20 20 00 20 20 20 20 20 20 20 20 20 20 20
0256 20 00 20 20 20 20 20 20 20 20 20 20 20 20 20 20
En fait apr�s avoir cogit� un petit moment je me suis dit:
"Et si je sauvais les octets dans un fichier binaire lorsque je
trouve un hit avec mon HEXUTIL afin de les dessassembler avec
SOURCER ?".
Aussitot dit aussitot fait. Et voil� ci-dessous le r�sultat:
CS:0000 B9 FFFF mov cx,0FFFFh
CS:0003 F2/ AE repne scasb ; Rep zf=0+cx >0 Scan es:[di] for al
CS:0005 F7 D1 not cx
CS:0007 2B F9 sub di,cx
CS:0009 F3/ A6 repe cmpsb ; Rep zf=1+cx >0 Cmp [si] to es:[di]
CS:000B 74 06 jz loc_2 ; Jump if zero
CS:000D 1B C0 sbb ax,ax
CS:000F F5 cmc ; Complement carry
CS:0010 15 0000 adc ax,0
CS:0013 8E DA loc_2: mov ds,dx ; xref CS:000B
CS:0015 5F pop di
CS:0016 5E pop si
CS:0017 CB retf
La valeur de IP est fausse mais on s'en fout car de toute fa�on on le
connait car on a trac� le programme jusqu'� cet endroit. Et d'autre
part c'est juste pour avoir des commentaires sur le code et pouvoir les
placer dans les DEPs.
Freddy
|